package es.gesfutbol.domini.implementacio;

import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;

import es.gesfutbol.domini.IEquip;

@Entity
@Table (name="equip")
public class Equip implements IEquip {

	/**
	 * 
	 */
	private static final long serialVersionUID = 3800561362851144343L;

	private Long idEquip;
	
	private String nom;
	
	private String ciutat;
	
	private Integer anyFundacio;
	
	private Estadi estadi;
	
	private Boolean esActiu;
	
	private String rutaNom;
	
	private String rutaEscut;
	
	private Set<Estadi> estadiAlternatiu;

	private Set<Lliga> lligues;
	
	private Set<Partit> partitsLocals;
	
	private Set<Partit> partitsVisitant;	
	
	private Set<EquipEnPenyista> equipsEnPenyistes;
	
	private Set<JugadorEnEquip> jugadorEnEquip;
	
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="idEquip", nullable=false, precision = 10, scale=0)
	public Long getIdEquip() {
		return idEquip;
	}

	public void setIdEquip(Long idEquip) {
		this.idEquip = idEquip;
	}
	
	@Column(name = "nom", length = 45, nullable=false)
	public String getNom() {
		return nom;
	}

	public void setNom(String nom) {
		this.nom = nom;
	}

	@Column(name = "ciutat", length = 45, nullable=false)
	public String getCiutat() {
		return ciutat;
	}

	public void setCiutat(String ciutat) {
		this.ciutat = ciutat;
	}

	@Column(name="anyFundacio", nullable=true, length=10)
	public Integer getAnyFundacio() {
		return anyFundacio;
	}

	public void setAnyFundacio(Integer anyFundacio) {
		this.anyFundacio = anyFundacio;
	}

	@OneToOne
	@JoinColumn(name="idEstadi", referencedColumnName = "idEstadi", nullable = false)
	public Estadi getEstadi() {
		return estadi;
	}

	public void setEstadi(Estadi estadi) {
		this.estadi = estadi;
	}

	@Column(name = "esActiu", nullable = true, precision = 1, scale = 0)
	public Boolean getEsActiu() {
		return esActiu;
	}

	public void setEsActiu(Boolean esActiu) {
		this.esActiu = esActiu;
	}
	

	@Column(name = "rutaNom", length = 45, nullable=true)
	public String getRutaNom() {
		return rutaNom;
	}

	public void setRutaNom(String rutaNom) {
		this.rutaNom = rutaNom;		
	}

	@Column(name = "rutaEscut", length = 45, nullable=true)
	public String getRutaEscut() {
		return rutaEscut;
	}

	public void setRutaEscut(String rutaEscut) {
		this.rutaEscut = rutaEscut;		
	}

	@ManyToMany
	@JoinTable(name="equip_en_estadi_alternatiu",  
			joinColumns=@JoinColumn(name="idEquip", referencedColumnName="idEquip"),
			inverseJoinColumns=@JoinColumn(name="idEstadi", referencedColumnName="idEstadi"),
			uniqueConstraints=@UniqueConstraint(columnNames={"idEquip","idEstadi"})
		)
	public Set<Estadi> getEstadiAlternatiu() {
		return estadiAlternatiu;
	}

	public void setEstadiAlternatiu(Set<Estadi> estadiAlternatiu) {
		this.estadiAlternatiu = estadiAlternatiu;
	}

	@ManyToMany(mappedBy="equips")
	public Set<Lliga> getLligues() {
		return lligues;
	}

	public void setLligues(Set<Lliga> lligues) {
		this.lligues = lligues;
	}

	@OneToMany(fetch=FetchType.LAZY, mappedBy="equipLocal", cascade=CascadeType.ALL)	
	public Set<Partit> getPartitsLocals() {
		return partitsLocals;
	}

	public void setPartitsLocals(Set<Partit> partitsLocals) {
		this.partitsLocals = partitsLocals;
	}

	@OneToMany(fetch=FetchType.LAZY, mappedBy="equipVisitant", cascade=CascadeType.ALL)
	public Set<Partit> getPartitsVisitant() {
		return partitsVisitant;
	}

	public void setPartitsVisitant(Set<Partit> partitsVisitant) {
		this.partitsVisitant = partitsVisitant;
	}

	@OneToMany(fetch=FetchType.LAZY, mappedBy="id.equip", cascade=CascadeType.ALL)
	public Set<EquipEnPenyista> getEquipsEnPenyistes() {
		return equipsEnPenyistes;
	}

	public void setEquipsEnPenyistes(Set<EquipEnPenyista> equipsEnPenyistes) {
		this.equipsEnPenyistes = equipsEnPenyistes;
	}

	@OneToMany(fetch=FetchType.LAZY, mappedBy="id.equip", cascade=CascadeType.ALL)
	public Set<JugadorEnEquip> getJugadorEnEquip() {
		return jugadorEnEquip;
	}

	public void setJugadorEnEquip(Set<JugadorEnEquip> jugadorEnEquip) {
		this.jugadorEnEquip = jugadorEnEquip;
	}	
}